在資料表的操作上,應該都遇到需要由Head與Body兩個表合併顯示內容的機會,例如Head記錄為財產類型,Body為財產子類型,將兩個表合併顯示時,會是這樣的內容:
資產類型 | 資產子類型 |
---|---|
LCD | 2.5" Portable LCD Monitor |
LCD | 4.3" Portable LCD Monitor |
LCD | LCD 17" |
LCD | LCD 18.5" W |
LCD | LCD 19" |
LCD | LCD 19" W |
LCD | LCD 19.5" W |
LCD | LCD 20" W |
LCD | LCD 21.5" W |
LCD | LCD 22" W |
Printer | Printer-All in One Ink |
Printer | Printer-All in One Laser |
Printer | Printer-Dot Matrix |
Printer | Printer-Ink Jet & Photo |
Printer | Printer-Laser |
但如果我想這樣呈現,要怎麼做到?
筆者建立了一個Function 陳述式,可以從查詢語句中,插入CST語句來進行產生清單的動作,用來達到這樣的顯示結果,以節省開發成本。
Function CST( _
strField, _
strTable, _
strWhere, _
Optional strGroup = "", _
Optional strOrderBy = "", _
Optional strInterval = " ", _
Optional strNewLine = vbCrLf, _
Optional bnNumbering As Boolean = False, _
Optional strBullets As String = "" _
) As String
'ConcatenateStringsTogether
'將某資料表依照strWhere,strGroup等帶出Data Records後
'依序將指定的strField資料合併成單一資料
'然後再傳回給SQL使用
'strField 要顯示的欄位
'strTable 資料表名稱
'strWhere Where語句
'strGroup Group語句
'strOrderBy OrderBy語句
'strInterval 各欄位間隔填充字串
'strNewLine 換行使用字元
'bnNumbering 是否編號
'strBullets 顯示項目符號字元
strSQL = "SELECT " & strField & " FROM " & strTable
If strGroup <> "" Then
strSQL = strSQL & vbCrLf & " GROUP BY " & strGroup
End If
If strWhere <> "" And strGroup = "" Then
strSQL = strSQL & vbCrLf & " WHERE " & strWhere
ElseIf strWhere <> "" And strGroup <> "" Then
strSQL = strSQL & vbCrLf & " HAVING " & strWhere
End If
If strOrderBy <> "" Then
strSQL = strSQL & vbCrLf & " ORDER BY " & strOrderBy
End If
On Error Resume Next
strData = ""
Set m = CurrentDb.OpenRecordset(strSQL)
j = 1
If m.EOF = False Then
Do
If strData <> "" Then strData = strData & strNewLine
strData2 = ""
For i = 0 To m.Fields.Count - 1
If strData2 <> "" Then strData2 = strData2 & strInterval
strData2 = strData2 & Trim(m(m.Fields(i).Name))
Next
If bnNumbering Then
strData = strData & Format(j, "0. ")
End If
If strBullets <> "" Then
strData = strData & strBullets
End If
strData = strData & strData2
m.MoveNext
j = j + 1
Loop Until m.EOF
End If
CST = strData
End Function
原本的SQL語句:
SELECT CT.NAME_ENG AS 資產類型, CST.NAME_ENG AS 資產子類型
FROM CategoryType AS CT INNER JOIN CategorySubType AS CST ON CT.INDEX = CST.CategoryType_INDEX
WHERE (((CT.NAME_ENG)="Printer" Or (CT.NAME_ENG)="LCD"))
ORDER BY CT.NAME_ENG, CST.NAME_ENG;
改成CST後的語句:
SELECT CT.NAME_ENG AS 資產類型, CST("NAME_ENG","CategorySubType","CategoryType_INDEX=" & [CT].[INDEX],"","NAME_ENG"," ",Chr(13) & Chr(10),True,"-> ") AS 資產子類型
FROM CategoryType AS CT
WHERE (((CT.NAME_ENG)="Printer" Or (CT.NAME_ENG)="LCD"))
ORDER BY CT.NAME_ENG;
程式中,「bnNumbering/是否編號」與 「strBullets/顯示項目符號字元」可以同時使用,也可以單獨使用,可以搭配出不同的效果。